Skip to content

docs(skills): the platform skill names every type a pair's override is served for, and that removing the pair's item serves the base's again - #30439

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-30229-adr0146-override-types
Nov 5, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/issue-30229-adr0146-override-types

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #30229

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:skills/objectstack-platform/SKILL.md 的 ADR-0146 段落。定制包(hotcrm.custom)覆盖项的生效类型从原文的 6 种改为平台今天实际服务的 12 种(view、dashboard、report、email_template、translation、flow、page、app、dataset、doc、book、mapping),并补一句:删除定制包里的覆盖项(DELETE …?package=hotcrm.custom)即重新服务基础包原件。该技能的 evals 新增两例:dataset/page 覆盖、撤销覆盖。
  • 为什么改:客户的 AI agent 读这份 skill 来写 .custom 包。旧文案少列 6 种类型且只字不提撤销,它要么拒绝一个本可做的 page/dataset 定制,要么告诉客户定制无法撤销。
  • 风险与回滚:纯文案与 eval 夹具,不碰任何运行时代码。token 棘轮 6000 → 6009(上限 6011):新增以删掉同段两处重复表述付账,不是改折行。回滚 = revert 本 PR。
  • 先看:skills/objectstack-platform/SKILL.md 第 128 行(三处改动都在这一行:类型清单、撤销一句、两处删减);其次 skills/objectstack-platform/evals/config-plugins-ops.json 新增 id 13、14。
  • 两分钟验证:node scripts/check-skills-token-ratchet.mjs,预期一行 skills/objectstack-platform/SKILL.md is 6009 tokens (ceiling 6011; headroom 2) 且 exit 0;git grep -n "today only for a view" skills/ 预期零命中。
  • 需要你做的:skills/** 为 Tier H,需人工批准后合并;审阅通过即合并本 PR。

What changes

One paragraph of skills/objectstack-platform/SKILL.md ("Customizing an installed package (ADR-0146)", line 128), read against origin/main fdd06415:

  • The served-type list. "today only for a view, dashboard, report, email_template, translation or flow" becomes "for a view, dashboard, report, email_template, translation, flow, page, app, dataset, doc, book or mapping". That is what the reads serve today: the five overlay types by their overlay path; flow by declinesStoredRow's first branch (packages/metadata-protocol/src/protocol-lock-state.ts, ADR-0146 D9 item 1); page, app, dataset, doc, book and mapping by SEALED_ROW_SERVED_OVERRIDE_TYPES (packages/metadata-protocol/src/protocol-package-bindings.ts, mapping the sixth since PR fix(metadata-protocol,app-shell): serve a pair's mapping override, let a pair remove any override it holds, name a working remedy for an excluded type (#30062) #30226).
  • The revert. "…the layered read and both lists serve it, and removing the pair's item (DELETE …?package=hotcrm.custom) serves the base's again" — isPairRowRemoval in packages/metadata-protocol/src/protocol-packaged-base-refusal.ts admits a removal naming the pair for every open override type, and the base's document is served once the row is gone (pinned by protocol.named-base-overlay-write.test.ts, "once the pair's row is deleted, the read serves the base row again").
  • Paid for inside the same paragraph (content deleted, not re-wrapped; each rule keeps another home): "and ignores any other package's declaration" (the next paragraph: "Only the pair declares: the save, publish and install doors, os validate and os build refuse overrides from any other package"), and ", never by a base-named or package-less read" (the same sentence already says "served only under its own ?package=").
  • Evals (skills/objectstack-platform/evals/config-plugins-ops.json): id 13, a dataset-and-page override declared from hotcrm.custom; id 14, undoing an override by removing the pair's item. Both cases' must_contain tokens are taught by SKILL.md (checked by hand: hotcrm.custom, overrides:, dataset, page, DELETE, ?package=hotcrm.custom). Case 13's must_not_contain is the two PUT routes alone (patch round).
  • Changeset .changeset/30229-adr0146-override-types.md: '@objectstack/skills': patch, carrying both machine lines.

Why the list and not the rule. The card prefers a rule that does not age. The code's rule is "every open override type" — isOpenOverrideType: disposition overridable in OVERRIDE_TYPE_CLASSIFICATION AND its ADR-0146 D9 conditions delivered (CONDITIONS_DELIVERED = flow alone). The spec's exported list OVERRIDABLE_METADATA_TYPES (13 names) includes action, whose override the write door still refuses as declared_type_not_yet_available; naming that symbol would promise one type the platform refuses, and "overridable" has no shorter customer-facing phrasing than the twelve names (the excluded types — permission set, position, capability, object — are already named in the next paragraph). So the paragraph names the current list; when action's door is cut it gains one word.

skills/** readings (the two the lane owes):

reading before (fdd06415) after (e3c97f55)
skills/objectstack-platform/SKILL.md lines 426 426
skills/objectstack-platform/SKILL.md tokens (check-skills-token-ratchet) 6000 / ceiling 6011 6009 / ceiling 6011 (headroom 2)
whole package, every skills/*/SKILL.md (11 files) lines 4534 4534
whole published bundle tokens (ratchet's "bundle total") 225708 226239 (+9 in SKILL.md; +522 in the eval fixture, measured but not ratcheted)

Tests

  • node scripts/check-skills-token-ratchet.mjs at e3c97f55: skills/objectstack-platform/SKILL.md is 6009 tokens (ceiling 6011; headroom 2) — exit 0.
  • pnpm --filter @objectstack/spec run check:skill-docs — exit 0; pnpm --filter @objectstack/spec run check:skill-refs — exit 0; pnpm check:doc-authoring — exit 0; pnpm check:skill-top-level-keys — exit 0.
  • @objectstack/skills is the one package this diff ships through (its build is sync-catalog.mjs, a byte copy of skills/**): built under the shared verify lock (VERDICT command-exit 0), then node packages/skills/scripts/sync-catalog.mjs --check — 97 file(s) under dist/skills are byte-identical to skills/**, exit 0; packages/skills/dist/skills/objectstack-platform/SKILL.md carries the new sentence and no longer carries "today only for a view"; the dist eval file carries id 14. The package declares no test or typecheck script, so ② is empty for it.
  • The evals JSON parses (14 cases, ids 1–14).
  • No ablation: no tested runtime behaviour changed (docs and an eval fixture).

Acceptance notes

  • NOT MEASURED locally, left to CI's Lint & Repo Gates: pnpm check:dts-closure, pnpm check:dual-build-cjs-loads, pnpm check:lean-entry-closure, pnpm check:sourcemap-no-sources-content — each exited 3 (PREREQUISITE NOT MET: they read every package's built dist/, a full workspace build this doc-only diff cannot move). A declared narrowing, not a skipped family.
  • pnpm check:dev-prereqs (local-only family, owed because the lock run built packages/spec): exit 1, "the workspace is not built — 103 of 107 packages declare an entry under dist/ that is not on disk" — the fresh worktree's state, not a finding about this diff; pnpm check:skill-frame-freshness: exit 0.
  • Observation, not filed (zero pull): the must_contain token oracle ui/scripts/check-skill-eval-tokens.mjs scans ui/skills only (SCAN_ROOTS = ['skills'], read under ui/), so the root skills/*/evals/*.json have no mechanical "is this token taught" check; the two new cases were checked by hand against SKILL.md.
  • Observation, not filed (boundary, not a trap): OVERRIDABLE_METADATA_TYPES in @objectstack/spec names action while the write door refuses an action override as not yet available (ADR-0146 D9, by design, with a message that says so). The skill text follows the door, not the spec list.

Verification

Derived with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on the actual diff (45 families; --tier: the MANDATORY tier, clause ①, skills/**, no one-line exit). Head e3c97f55 (patch round: contract review 6657115315's should-fix — eval 13's must_not_contain no longer carries only for views, a substring of its own prompt; nothing else changed). The 45-family run below was taken at 75b0062c; re-run at e3c97f55 for the changed path: evals JSON parses (14 cases), node scripts/check-skills-token-ratchet.mjs exit 0 (SKILL.md 6009 / 6011; eval fixture 3251 tokens), pnpm --filter @objectstack/spec run check:skill-refs exit 0, pnpm check:doc-authoring exit 0. Every command run in the worktree, exit code captured before any pipe; --ran reconciliation: 45 derived famil(ies) accounted for — 41 run, 4 NOT-MEASURED (4 DERIVED from a recorded exit 3).

Exit codes, one per derived command (plus check:skill-refs beyond the union)
0  node scripts/check-adr-0087-registration.mjs --base origin/main
0  node scripts/check-adr-0087-registration.mjs --self-test
0  node scripts/check-changeset-no-major.mjs --base origin/main
0  node scripts/check-closing-keyword-parity.mjs
0  node scripts/check-closing-keyword-parity.mjs --self-test
0  node scripts/check-comment-mask-corpus.mjs
0  node scripts/check-doc-route-spelling.mjs --advisory
0  node scripts/check-doc-route-spelling.mjs --self-test
0  node scripts/check-dts-emitted.mjs --self-test
0  node scripts/check-empty-changeset.mjs --base origin/main
0  node scripts/check-empty-changeset.mjs --self-test
0  node scripts/check-skills-token-ratchet.mjs
0  node scripts/check-skills-token-ratchet.mjs --self-test
0  node scripts/ci/assert-turbo-remote-cache.mjs --self-test
0  node scripts/ci/plan-test-core-shards.mjs --self-test
0  node scripts/ci/prune-turbo-cache.mjs --self-test
0  node scripts/pm/release-rehearsal-clone.mjs --self-test
0  node scripts/release-pending-publish.mjs --self-test
0  pnpm --filter @objectstack/lint run check:doc-formula-expressions   (first run exit 3 — formula and lint not built; re-run after the targeted build: 0)
0  pnpm --filter @objectstack/spec run check:skill-docs
0  pnpm check:agent-test-spelling
0  pnpm check:changeset-gate-self-tests
0  pnpm check:ci-filter-parity
0  pnpm check:closed-ceremony-text
0  pnpm check:corpus-claim-drift
0  pnpm check:cross-package-test-inputs
0  pnpm check:doc-authoring
0  pnpm check:driver-memory-census
3  pnpm check:dts-closure                     NOT MEASURED (needs full workspace build)
3  pnpm check:dual-build-cjs-loads            NOT MEASURED (needs full workspace build)
0  pnpm check:gitlink-declared
3  pnpm check:lean-entry-closure              NOT MEASURED (needs @objectstack/objectql built)
0  pnpm check:merge-driver
0  pnpm check:nul-bytes
0  pnpm check:pm-governed-merges
0  pnpm check:pm-skill-id-lint
0  pnpm check:published-files
0  pnpm check:refd-timer-probe
0  pnpm check:role-word
0  pnpm check:skill-compatibility
0  pnpm check:skill-frame-sync
0  pnpm check:skill-identifier-liveness
0  pnpm check:skill-top-level-keys
3  pnpm check:sourcemap-no-sources-content    NOT MEASURED (needs full workspace build)
0  pnpm check:watch-hint-literal
0  pnpm --filter @objectstack/spec run check:skill-refs   (beyond the union; PM-named)
Ratchet line and shipped-catalog proof at 75b0062
✓ check-skills-token-ratchet: skills/objectstack-platform/SKILL.md is 6009 tokens (ceiling 6011; headroom 2).
✓ check-skills-token-ratchet: skills/objectstack-platform/evals/config-plugins-ops.json is 3258 tokens — eval fixture, measured but not ratcheted.
✓ check-skills-token-ratchet: 57 authored bundle file(s) within their ceilings; 10 generator-owned file(s) and 29 eval fixture(s) measured, not ratcheted.
os-verify-lock: VERDICT command-exit 0 · held the lock 93s (1m33s) · waited 0s   (turbo build: @objectstack/formula, @objectstack/lint, @objectstack/skills + closure; Tasks: 5 successful, 5 total)
✓ @objectstack/skills: 97 file(s) under dist/skills are byte-identical to skills/**.

Generated by Claude Code

…s served for, and that removing the pair's item serves the base's again

The ADR-0146 paragraph of skills/objectstack-platform/SKILL.md named six
types a `.custom` pair's declared override is served for; the reads serve
twelve (SEALED_ROW_SERVED_OVERRIDE_TYPES joined the five overlay types and
flow), and a removal naming the pair serves the base's document again,
which the paragraph did not say. Two evals: a dataset-and-page override,
and the removal.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012MmDsR4AZoJZyzKQcBEESh
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface labels Nov 5, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 75b0062cedb3c013c7a35433c156a05ec9c2d70e
Local-runs: none
Scope: skills/objectstack-platform/SKILL.md, skills/objectstack-platform/evals/config-plugins-ops.json + packages/spec/src/kernel/customization-package.ts, packages/spec/src/kernel/metadata-plugin.zod.ts, packages/spec/src/api/rest-server.zod.ts, packages/metadata-protocol/src/protocol-packaged-base-refusal.ts, packages/metadata-protocol/src/protocol-package-bindings.ts, packages/metadata-protocol/src/protocol-lock-state.ts, packages/metadata-protocol/src/served-override.ts, packages/metadata-protocol/src/protocol-environment-rows.ts, packages/metadata-protocol/src/protocol-diff-delete-load.ts, packages/metadata-protocol/src/protocol.named-base-overlay-write.test.ts, packages/rest/src/meta-item-write-routes.ts, packages/rest/src/rest-server.ts, packages/spec/scripts/build-skill-docs.ts, skills/objectstack-api/SKILL.md. The remainder of the diff (.changeset/30229-adr0146-override-types.md) is the lane seat's ACCEPT at TIER_DEFAULT.

Cited code read on origin/main at f18adce2; inputs: card #30229 (body and every comment), PR #30439 (body, file list, net diff), and the head's check-runs. Judged on the tree, not on the PR body's account of it.

① Derived judgments

  • Served-type list, six to twelve — right. OVERRIDE_TYPE_CLASSIFICATION carries thirteen overridable rows; isOpenOverrideType admits a row with no D9 conditions or one named in CONDITIONS_DELIVERED (= flow), so action is classified overridable and refused at the door as declared_type_not_yet_available. The twelve are served by three paths on main: view, dashboard, report, translation and email_template (allowEnvironmentOverlay: true) through findServedOverlayRow's servedOverride candidate and isServedOverrideRowOf; flow through declinesStoredRow's first branch; page, app, dataset, doc, book and mapping through SEALED_ROW_SERVED_OVERRIDE_TYPES in its last branch. No served type is missing: an action row is declined (isUnservedSealedOverlay true, servesSealedOverrideRow false), a permission set is the security catalog's own channel (isServedOverrideRowOf is false for it, and the next paragraph already says never overridden), an object is extend_only. Naming the list rather than OVERRIDABLE_METADATA_TYPES is the right call: that symbol would promise action.
  • The revert sentence — right. isPairRowRemoval(type, owner, packageId) admits a removal naming the base's pair for every open type; deleteMetaItem then skips refusePackagedBaseRemoval, deletes with intent: 'runtime-only', and restoreArtifactRegistryView lifts the shadow, so the code package's item is what the reads serve. Pinned for a view at protocol.named-base-overlay-write.test.ts:767 (the read serves the base again; its rollback stays refused). A removal naming no package, the base, or another package keeps its refusal, so "naming the pair" is the right instruction.
  • The DELETE URL — real route, real spelling. DELETE ${metaPath}/:type/:name (meta-item-write-routes.ts:380), metaPath = /api + /v1 + /meta by the spec defaults; package is in the closed set META_ITEM_RESET_PARAMS and read by metaItemPackageBinding(req.query.package); singular view is the canonical type spelling. The eval's DELETE /api/v1/meta/view/crm_account_grid?package=hotcrm.custom is that route.
  • The two clauses deleted to pay the ratchet — each rule survives. "and ignores any other package's declaration": the read rule stays in the same sentence ("honours it only from the pair (the row's package_id)"), and the write rule at line 130 ("Only the pair declares: the save, publish and install doors, os validate and os build refuse overrides from any other package"); eval 10's reference answer still says "no declaration from any other package (ignored)". ", never by a base-named or package-less read": "served only under its own ?package=" in the same clause is that rule stated with "only". Nothing a customer agent loads lost either rule.
  • Public surface. No runtime code moves; what publishes is @objectstack/skills (dist/skills is a byte copy of skills/**), so the changeset's target is right.

② Semver level

'@objectstack/skills': patch with Clause-②: no and Metadata-protocol: none, both in the changeset body and in the PR body — matches the diff: prose plus an eval fixture; no authorable key, value or type moves; nothing narrows. skip-changeset would have been wrong (the diff ships in a released package). gen:skill-docs reads frontmatter only (build-skill-docs.ts), so a body change owes no generated artifact. The declaration line reads no, no arm — right.

③ Boundary flags

  • Four derived gates NOT MEASURED locally (check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content): answered by the head's check-runs — every Lint · … and Type Check · … job concluded success.
  • check:dev-prereqs exit 1 on the unbuilt worktree: a local-only family, says nothing about the diff. Answered.
  • Model-free commit trailers: the form AGENTS.md asks for. Answered.
  • No PR labels sent; documentation, size/s and tooling are the labeler's. Answered.
  • open_questions: none.
  • Observation (the must_contain oracle scans ui/skills only): re-done by hand — every must_contain token of cases 13 and 14 is a whole token of SKILL.md at the head (hotcrm.custom, overrides:, dataset, page, DELETE, ?package=hotcrm.custom). Answered; nothing to escalate.
  • Observation (OVERRIDABLE_METADATA_TYPES names action): the door is the authority for what a customer may do, and the skill follows the door. Answered; nothing to escalate.
  • Token ratchet 6009 of 6011: in the Lint · repo & tooling gates job, success.
  • Check-runs as read at 2026-11-05T11:42Z: 26 success, 13 skipped, Test Core (1/8) still in_progress — a test shard a prose-and-fixture diff cannot move; its conclusion stays the gate's.

④ Design judgment

skills/objectstack-platform/SKILL.md — against the card's eval prompts and the code on main: holds. The paragraph now says what the reads do (twelve types, none the door refuses), the revert ADR-0146 names, and the one instruction that makes the revert work (name the pair). Tried to break it: an email_template override is one row per (name, locale), so its removal names the member too — the ellipsis in DELETE …?package=hotcrm.custom covers the selector and the sentence before it already teaches the per-locale identity; the pair's own ?package=hotcrm.custom read is not claimed to serve the base; the D11 and dependent-locale sentences are untouched. No finding.

  • Note, not a finding: the bundle never spells the meta item path (/api/v1/meta/:type/:name is taught by skills/objectstack-api/SKILL.md:69), so the … leans on the sibling bundle; at headroom 2 that is the right trade.

skills/objectstack-platform/evals/config-plugins-ops.json — cases 13 and 14 exercise exactly what acceptance 2 asks (a dataset-and-page override; a removal); their must_contain tokens are taught; neither reference answer spells one of its own must_not_contain strings; the route tokens follow the file's own convention (case 10).

  • should-fix — case 13's must_not_contain carries only for views, a substring of its own prompt ("…or is that only for views?"). The natural correct opening — "No, not only for views" — is graded as a failure. It is the only one of the fourteen cases whose prompt contains one of its own forbidden strings. Fix in place: drop the token (the dataset and page must_contain already catch a views-only answer), or re-spell the prompt so the phrase is not the answer's echo.
  • Note, not a finding: PUT /api/v1/meta/dataset/crm_pipeline also matches a pair-named save (…?package=hotcrm.custom), which saveMetaItem admits; the bundle teaches the override as a package-authored declaration and never through the item door, and case 10 set the same convention, so it stands.

No must-fix.

Implemented-by: claude/issue-30229-adr0146-override-types
Reviewed-by: session_012MmDsR4AZoJZyzKQcBEESh

VERDICT: PASS

`only for views` sat in case 13's must_not_contain and in its prompt, so
a correct answer opening "No, not only for views" graded as a failure.
The `dataset` and `page` must_contain tokens already catch a views-only
answer. Contract review should-fix on PR #30439.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012MmDsR4AZoJZyzKQcBEESh
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: e3c97f55e5c9cbe7cf48dfcdb82e712cabda213c
Local-runs: none
Scope: skills/objectstack-platform/SKILL.md, skills/objectstack-platform/evals/config-plugins-ops.json + packages/spec/src/kernel/customization-package.ts, packages/spec/src/kernel/metadata-plugin.zod.ts, packages/spec/src/api/rest-server.zod.ts, packages/metadata-protocol/src/protocol-packaged-base-refusal.ts, packages/metadata-protocol/src/protocol-package-bindings.ts, packages/metadata-protocol/src/protocol-lock-state.ts, packages/metadata-protocol/src/served-override.ts, packages/metadata-protocol/src/protocol-environment-rows.ts, packages/metadata-protocol/src/protocol-diff-delete-load.ts, packages/metadata-protocol/src/protocol.named-base-overlay-write.test.ts, packages/rest/src/meta-item-write-routes.ts, packages/rest/src/rest-server.ts, packages/spec/scripts/build-skill-docs.ts, skills/objectstack-api/SKILL.md (the cited set of record 6657115315; the delta cites nothing new). The remainder of the diff (.changeset/30229-adr0146-override-types.md) is the lane seat's ACCEPT at TIER_DEFAULT.

Delta review of record 6657115315 (PASS on 75b0062c): one findings-only commit, 75b0062c...e3c97f55, one file, one hunk (0 added, 1 removed). SKILL.md at e3c97f55 is byte-identical to the head reviewed; the changeset is untouched; the commit carries the model-free trailer pair.

① Derived judgments

Carry over unchanged from 6657115315. The delta moves no served-type list, no route and no rule a customer agent loads; the only published change is one fewer must_not_contain string in an eval fixture.

② Semver level

Carry over unchanged: '@objectstack/skills': patch, Clause-②: no, Metadata-protocol: none still match the diff (prose plus an eval fixture); an assertion removed from a fixture publishes nothing new.

③ Boundary flags

  • Carry over unchanged from 6657115315: the four NOT-MEASURED gates, check:dev-prereqs, the trailers, the labels, the two observations; open_questions none.
  • Check-runs on e3c97f55 as read at 2026-11-05T11:49Z: 19 success (Check Changeset, Lint · docs & code guards, Governed Surface Queue Guard, the PR-body guards among them), 15 skipped, 8 in_progress (Lint · repo & tooling gates, Lint · CI, release & engine gates, Lint · ESLint, Type Check · source gates, Type Check · consumer gates, Build Core, Test Core (1/8), Test Core (2/8)). A fresh push, recorded as seen and not waited for; their conclusions stay the gate verdicts. The same families concluded success on 75b0062c, and the delta is one JSON line in a fixture the token ratchet measures but does not ratchet.

④ Design judgment

skills/objectstack-platform/evals/config-plugins-ops.json — the one changed hunk: case 13's must_not_contain drops only for views, the should-fix of 6657115315, and keeps its two route strings. Re-read at e3c97f55: the file parses (14 cases, ids 1–14); case 13 keeps its four taught must_contain tokens (hotcrm.custom, overrides:, dataset, page), which still catch a views-only answer; no case of the fourteen now carries a must_not_contain string inside its own prompt or reference answer. The fix is the one the record named and takes nothing else with it. No finding.

skills/objectstack-platform/SKILL.md — unchanged byte for byte; ④ of 6657115315 carries over.

No must-fix; the should-fix of 6657115315 is closed.

Implemented-by: claude/issue-30229-adr0146-override-types
Reviewed-by: session_012MmDsR4AZoJZyzKQcBEESh

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh

席位核对 — ACCEPT · domain:skills#2 · 2026-11-05T12:04Z

Head-sha: e3c97f55e5c9cbe7cf48dfcdb82e712cabda213c

维护者速读

  • 改了什么:objectstack-platform 技能「定制已安装包(ADR-0146)」一段:配对包 .custom 的声明式覆盖原写「只对 6 种类型生效」,改为平台实际服务的 12 种(view、dashboard、report、email_template、translation、flow、page、app、dataset、doc、book、mapping),并补一句「删除配对包里的那一项(DELETE …?package=hotcrm.custom)即恢复基础包版本」;evals 加两例(覆盖 dataset/page、撤销覆盖)。行数净 0,token 6009/6011。
  • 为什么改:客户的 AI 读到「只有 6 种」会拒绝覆盖页面或数据集,或告诉客户定制撤不回;平台早已支持。
  • 风险与回滚:纯教学文本 + eval 夹具;回滚即 revert。为付 token 天花板删了两个从句,其规则在同段与第 130 行仍在(契约复核逐条核过)。
  • 先看:skills/objectstack-platform/SKILL.md 第 128 行(单行段落)。
  • 两分钟验证:grep -c "today only for a view" skills/objectstack-platform/SKILL.md 应为 0;node scripts/check-skills-token-ratchet.mjs 绿。
  • 需要你做的:skills/** 是 Tier H。契约复核 PASS 在案(评论 6657115315 于 75b0062c,delta PASS 6657246575 于现 head e3c97f55);请 GOVERNED_APPROVERS 账号 APPROVE,席位随后落地。

席位意见:可合。用清单而非引 OVERRIDABLE_METADATA_TYPES 是对的 —— 该符号含 action,而写入门对 action 覆盖仍拒(declared_type_not_yet_available)。

核对

  1. 形态:draft → main;正文首行 Fixes #30229;Clause-②: no · Metadata-protocol: none 在正文与 changeset。文件面 = 认领申报面(SKILL.md、evals/config-plugins-ops.json、.changeset/30229-adr0146-override-types.md)。
  2. 前提实测:席位在 origin/main 亲读 SEALED_ROW_SERVED_OVERRIDE_TYPES = page, app, dataset, doc, book, mapping;删掉的两个从句的规则在第 128 行「honours it only from the pair」、第 130 行「refuse overrides from any other package」与「served only under its own ?package=」仍在。
  3. 门禁 check-runs(head e3c97f55,2026-11-05T12:04Z):30 success、15 skipped、0 失败/挂起;mergeable_state: clean。
  4. 接受的偏差:4 个需全仓构建的门禁族本地 NOT MEASURED(CI 已绿);check:dev-prereqs 本地 exit 1 属新 worktree 未构建;补丁轮按契约复核 should-fix 删 eval 13 的 only for views。
  5. 范围外去向:两条观察(根 skills/*/evals 的 must_contain 无机械「是否已教」判据;OVERRIDABLE_METADATA_TYPES 含 action 而写门拒)均无 reach:,不属立卡三类 → Acceptance notes。Skills-docs: 不欠(种类 none)。
  6. 落地条款:Tier H(check-governed-merges --pr 30439:46 行 ≤ 3000)。获授权 APPROVED 后席位过落地前检、清标、pr_ready + automerge_enable。changeset 正文逐句已核:标题行、两条机器行、「a .custom pair's declared override is served for … (the paragraph named six)」「removing the pair's item … serves the base's document again」「The package's evals gain a dataset-and-page override case and a removal case.」—— 与 diff 一致。

Generated by Claude Code

@objectstack-fleet objectstack-fleet Bot added the needs-user-decision Blocked on a maintainer decision — do not dispatch; decision cards only, never on a PR label Nov 5, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review November 5, 2026 12:06
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 5, 2026
Merged via the queue into main with commit 0e42aef Nov 5, 2026
51 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-30229-adr0146-override-types branch November 5, 2026 12:30
@objectstack-fleet objectstack-fleet Bot removed the needs-user-decision Blocked on a maintainer decision — do not dispatch; decision cards only, never on a PR label Nov 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Projects

None yet

2 participants